Reactã®useFormStatusããã¯ã«é¢ããå æ¬çã¬ã€ãããã©ãŒã éä¿¡ã®é²æè¿œè·¡ããšã©ãŒãã³ããªã³ã°ãã¢ãã³ãªWebã¢ããªã§ã®ãŠãŒã¶ãŒäœéšåäžã®ããã®ãã¹ããã©ã¯ãã£ã¹ã解説ããŸãã
React useFormStatus: ãã©ãŒã éä¿¡ã®é²æè¿œè·¡ããã¹ã¿ãŒãã
çŸä»£ã®Webéçºã«ãããŠããã©ãŒã éä¿¡æã«ã·ãŒã ã¬ã¹ã§æ
å ±è±å¯ãªãŠãŒã¶ãŒäœéšãæäŸããããšã¯éåžžã«éèŠã§ããReact 18ã§å°å
¥ãããReactã®useFormStatusããã¯ã¯ããã©ãŒã ã®éä¿¡ç¶æ
ã远跡ããããã®åŒ·åã§æŽç·Žããããœãªã¥ãŒã·ã§ã³ãæäŸããŸãããã®å
æ¬çãªã¬ã€ãã§ã¯ãuseFormStatusã®è€éãªè©³çްãæãäžãããã®æ©èœããŠãŒã¹ã±ãŒã¹ããããŠé
åçã§ã¬ã¹ãã³ã·ããªãã©ãŒã ã€ã³ã¿ã©ã¯ã·ã§ã³ãäœæããããã®ãã¹ããã©ã¯ãã£ã¹ãæ¢æ±ããŸãã
React useFormStatusãšã¯ïŒ
useFormStatusã¯ããã©ãŒã éä¿¡ã®ã¹ããŒã¿ã¹ã«é¢ããæ
å ±ãæäŸããããã«èšèšãããReactããã¯ã§ããããã«ãããéä¿¡ã®é²æç®¡çãšè¡šç€ºããšã©ãŒã®åŠçããããŠããã«å¿ããUIã®æŽæ°ããã»ã¹ãç°¡çŽ åãããŸãããã®ããã¯ãå°å
¥ãããåã¯ãéçºè
ã¯æåã®ç¶æ
管çãéåææäœã«é Œãããšãå€ãããããè€éã§ãšã©ãŒãçºçããããã³ãŒãã«ã€ãªããããšããããŸããã
ãã®ããã¯ã¯ã以äžã®ããããã£ãæã€ãªããžã§ã¯ããè¿ããŸãïŒ
pending: ãã©ãŒã ãçŸåšéä¿¡äžãã©ããã瀺ãããŒã«å€ãdata: å©çšå¯èœãªå Žåããã©ãŒã ã«ãã£ãŠéä¿¡ãããããŒã¿ãmethod: ãã©ãŒã éä¿¡ã«äœ¿çšãããHTTPã¡ãœããïŒäŸïŒãPOSTãããGETãïŒãaction: ãã©ãŒã éä¿¡ãåŠçãã颿°ãŸãã¯URLãerror: éä¿¡ã倱æããå Žåã®ãšã©ãŒãªããžã§ã¯ããããã«ããããŠãŒã¶ãŒã«ãšã©ãŒã¡ãã»ãŒãžã衚瀺ã§ããŸãã
ãªãuseFormStatusã䜿ãã®ãïŒå©ç¹ãšã¡ãªãã
useFormStatusãæŽ»çšããããšã«ã¯ãããã€ãã®äž»èŠãªå©ç¹ããããŸãïŒ
- ãã©ãŒã ç¶æ 管çã®ç°¡çŽ åïŒ ãã©ãŒã éä¿¡ç¶æ ã®ç®¡çãäžå åããå®åçãªã³ãŒããåæžããä¿å®æ§ãåäžãããŸãã
- ãŠãŒã¶ãŒäœéšã®åäžïŒ éä¿¡ã®é²æããŠãŒã¶ãŒã«æç¢ºãã€äžè²«ããæ¹æ³ã§ç€ºãããšã³ã²ãŒãžã¡ã³ããé«ãããã©ã¹ãã¬ãŒã·ã§ã³ã軜æžããŸãã
- ãšã©ãŒãã³ããªã³ã°ã®åŒ·åïŒ ãšã©ãŒã®æ€åºãšå ±åãç°¡çŽ åããé信倱æã®åªé ãªåŠçãå¯èœã«ããŸãã
- 宣èšçãªã¢ãããŒãïŒ ãã宣èšçãªã³ãŒãã£ã³ã°ã¹ã¿ã€ã«ãä¿é²ããã³ãŒããèªã¿ããããçè§£ããããããŸãã
- ãµãŒããŒã¢ã¯ã·ã§ã³ãšã®çµ±åïŒ ReactãµãŒããŒã¢ã¯ã·ã§ã³ãšã·ãŒã ã¬ã¹ã«çµ±åãããµãŒããŒã¬ã³ããªã³ã°ã¢ããªã±ãŒã·ã§ã³ã§ã®ãã©ãŒã åŠçãããã«å¹çåããŸãã
åºæ¬çãªäœ¿çšæ³ïŒç°¡åãªäŸ
useFormStatusã®åºæ¬çãªäœ¿çšæ³ã説æããããã«ãç°¡åãªäŸããå§ããŸãããã
ã·ããªãªïŒç°¡åãªã³ã³ã¿ã¯ããã©ãŒã
ååãã¡ãŒã«ã¢ãã¬ã¹ãã¡ãã»ãŒãžã®ãã£ãŒã«ããæã€ç°¡åãªã³ã³ã¿ã¯ããã©ãŒã ãæ³åããŠãã ããããã©ãŒã ãéä¿¡äžã®éã¯ããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒã衚瀺ããéä¿¡ã倱æããå Žåã¯ãšã©ãŒã¡ãã»ãŒãžã衚瀺ããããšããŸãã
ã³ãŒãäŸ
ãŸããç°¡åãªãµãŒããŒã¢ã¯ã·ã§ã³ãå®çŸ©ããŸãããïŒéåžžãããã¯å¥ã®ãã¡ã€ã«ã«é 眮ããŸãããããã§ã¯å®å šãæãããã«å«ããŠããŸãïŒïŒ
async function submitForm(formData) {
'use server';
// "pending"ç¶æ
ããã¢ããããã«é
å»¶ãã·ãã¥ã¬ãŒãããŸãã
await new Promise(resolve => setTimeout(resolve, 2000));
// æœåšçãªãšã©ãŒãã·ãã¥ã¬ãŒãããŸãã
const name = formData.get('name');
if (name === 'error') {
throw new Error('ã·ãã¥ã¬ãŒããããéä¿¡ãšã©ãŒã');
}
console.log('ãã©ãŒã ã¯æ£åžžã«éä¿¡ãããŸããïŒ', formData);
return { message: 'ãã©ãŒã ãæ£åžžã«éä¿¡ãããŸããïŒ' };
}
次ã«ãuseFormStatusã䜿çšããŠReactã³ã³ããŒãã³ããäœæããŸãããïŒ
'use client';
import { useFormStatus } from 'react-dom';
function ContactForm() {
const { pending, data, error } = useFormStatus();
return (
);
}
export default ContactForm;
解説
'react-dom'ããuseFormStatusãã€ã³ããŒãããŸããããã¯ã¯ã©ã€ã¢ã³ããµã€ãã®ããã¯ã䜿çšããŠãããããã¯ã©ã€ã¢ã³ãã³ã³ããŒãã³ãã§ããããšã«æ³šæããŠãã ãããContactFormã³ã³ããŒãã³ãå ã§useFormStatus()ãåŒã³åºããpendingãdataãerrorã®å€ãååŸããŸããpendingã®å€ã¯ããã©ãŒã ãéä¿¡äžã®éãéä¿¡ãã¿ã³ãç¡å¹ã«ãããéä¿¡äž...ããšããã¡ãã»ãŒãžã衚瀺ããããã«äœ¿çšãããŸããerrorãçºçããå Žåããã®ã¡ãã»ãŒãžãèµ€è²ã®æ®µèœã§è¡šç€ºãããŸãã- ãµãŒããŒã¢ã¯ã·ã§ã³ãã
dataãè¿ãããå Žåãæåã¡ãã»ãŒãžã衚瀺ããŸãã
é«åºŠãªãŠãŒã¹ã±ãŒã¹ãšãã¯ããã¯
åºæ¬çãªäŸãè¶
ããŠãuseFormStatusã¯ããè€éãªã·ããªãªã§äœ¿çšããŠããŠãŒã¶ãŒäœéšãåäžãããããŸããŸãªãã©ãŒã éä¿¡èŠä»¶ã«å¯Ÿå¿ããããšãã§ããŸãã
1. ã«ã¹ã¿ã ããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒãšã¢ãã¡ãŒã·ã§ã³
åçŽãªãéä¿¡äž...ããšããããã¹ãã®ä»£ããã«ãã«ã¹ã¿ã ã®ããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒãã¢ãã¡ãŒã·ã§ã³ã䜿çšããŠãããèŠèŠçã«é åçãªäœéšãæäŸã§ããŸããäŸãã°ãã¹ãããŒã³ã³ããŒãã³ããããã°ã¬ã¹ããŒã䜿çšããããšãã§ããŸãã
function ContactForm() {
const { pending, error } = useFormStatus();
return (
);
}
function Spinner() {
return ããŒãã£ã³ã°äž...; // ãããããªãã®ã¹ãããŒã³ã³ããŒãã³ãã«çœ®ãæããŠãã ãã
}
2. ãªããã£ãã¹ãã£ãã¯æŽæ°ïŒæ¥œèŠ³çæŽæ°ïŒ
ãªããã£ãã¹ãã£ãã¯æŽæ°ã¯ããµãŒããŒããã®ç¢ºèªãåãåãåã§ãããã©ãŒã ã®éä¿¡ãæåãããã®ããã«UIãæŽæ°ããããšã§ããŠãŒã¶ãŒã«å³æã®ãã£ãŒãããã¯ãæäŸããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³ã®äœæããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãã§ããŸãã
æ³šïŒ ãªããã£ãã¹ãã£ãã¯æŽæ°ã§ã¯ããšã©ãŒãã³ããªã³ã°ãšããŒã¿ã®äžè²«æ§ãæ éã«èæ ®ããå¿ èŠããããŸããéä¿¡ã倱æããå Žåã¯ãUIã以åã®ç¶æ ã«æ»ãå¿ èŠããããŸãã
3. ããŸããŸãªãšã©ãŒã·ããªãªã®åŠç
useFormStatusã«ãã£ãŠè¿ãããerrorããããã£ã䜿çšãããšãããªããŒã·ã§ã³ãšã©ãŒããããã¯ãŒã¯ãšã©ãŒããµãŒããŒãµã€ããšã©ãŒãªã©ãããŸããŸãªãšã©ãŒã·ããªãªãåŠçã§ããŸããæ¡ä»¶ä»ãã¬ã³ããªã³ã°ã䜿çšããŠããšã©ãŒã®çš®é¡ã«åºã¥ããŠç¹å®ã®ãšã©ãŒã¡ãã»ãŒãžã衚瀺ã§ããŸãã
function ContactForm() {
const { pending, error } = useFormStatus();
return (
);
}
4. ãµãŒãããŒãã£ã®ãã©ãŒã ã©ã€ãã©ãªãšã®çµ±å
useFormStatusã¯ãã©ãŒã ã®éä¿¡ç¶æ
ã远跡ããç°¡åãªæ¹æ³ãæäŸããŸãããFormikãReact Hook Formã®ãããªããå
æ¬çãªãã©ãŒã ã©ã€ãã©ãªãšçµ±åãããå Žåãããã§ãããããããã®ã©ã€ãã©ãªã¯ãããªããŒã·ã§ã³ããã©ãŒã ã®ç¶æ
管çãéä¿¡åŠçãªã©ã®é«åºŠãªæ©èœãæäŸããŸãã
useFormStatusã䜿çšããŠãããã®ã©ã€ãã©ãªãæ¡åŒµããéä¿¡ã®é²æã衚瀺ããšã©ãŒãåŠçããããã®äžè²«ããæ¹æ³ãæäŸããããšãã§ããŸãã
5. ããã°ã¬ã¹ããŒãšããŒã»ã³ããŒãž
æéã®ããããã©ãŒã éä¿¡ã®å Žåãããã°ã¬ã¹ããŒãããŒã»ã³ããŒãžã衚瀺ããããšã§ããŠãŒã¶ãŒã«è²Žéãªãã£ãŒãããã¯ãæäŸãããšã³ã²ãŒãžã¡ã³ããç¶æããããšãã§ããŸãã`useFormStatus`ã¯çŽæ¥é²æç¶æ³ãæäŸããŸãããã鲿ãå ±åãããµãŒããŒã¢ã¯ã·ã§ã³ïŒäŸïŒãµãŒããŒã»ã³ãã€ãã³ããWebSocketçµç±ïŒãšçµã¿åãããããšãã§ããŸãã
useFormStatusã䜿çšããããã®ãã¹ããã©ã¯ãã£ã¹
useFormStatusã广çã«æŽ»çšããå
ç¢ã§ãŠãŒã¶ãŒãã¬ã³ããªãŒãªãã©ãŒã äœéšãåµåºããããã«ã以äžã®ãã¹ããã©ã¯ãã£ã¹ãèæ
®ããŠãã ããïŒ
- æç¢ºãªèŠèŠçãã£ãŒãããã¯ãæäŸããïŒ ãã©ãŒã éä¿¡äžã¯ãããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒãããã°ã¬ã¹ããŒãã¹ããŒã¿ã¹ã¡ãã»ãŒãžãªã©ãåžžã«ãŠãŒã¶ãŒã«èŠèŠçãªãã£ãŒãããã¯ãæäŸããŠãã ããã
- ãšã©ãŒãé©åã«åŠçããïŒ å ç¢ãªãšã©ãŒãã³ããªã³ã°ãå®è£ ããŠéä¿¡ã®å€±æãæ€åºãå ±åãããŠãŒã¶ãŒã«æçãªãšã©ãŒã¡ãã»ãŒãžãæäŸããŠãã ããã
- ã¢ã¯ã»ã·ããªãã£ãèæ ®ããïŒ é©åãªARIA屿§ãšããŒããŒãããã²ãŒã·ã§ã³ã®ãµããŒããæäŸãããã©ãŒã ã®ã€ã³ã¿ã©ã¯ã·ã§ã³ãé害ãæã€ãŠãŒã¶ãŒã«ãã¢ã¯ã»ã¹å¯èœã§ããããšã確èªããŠãã ããã
- ããã©ãŒãã³ã¹ãæé©åããïŒ ã³ã³ããŒãã³ããã¡ã¢åããããŒã¿ãã§ãããæé©åããããšã§ãäžèŠãªåã¬ã³ããªã³ã°ãé¿ããŠãã ããã
- 培åºçã«ãã¹ãããïŒ ãã©ãŒã ã®ã€ã³ã¿ã©ã¯ã·ã§ã³ã培åºçã«ãã¹ãããããŸããŸãªã·ããªãªãç°å¢ã§æåŸ ã©ããã«æ©èœããããšã確èªããŠãã ããã
useFormStatusãšãµãŒããŒã¢ã¯ã·ã§ã³
useFormStatusã¯ãReactãµãŒããŒã¢ã¯ã·ã§ã³ãšã·ãŒã ã¬ã¹ã«é£æºããããã«èšèšãããŠããŸãããµãŒããŒã¢ã¯ã·ã§ã³ã¯ããã©ãŒã éä¿¡ããµãŒããŒã§çŽæ¥åŠçããããã®åŒ·åãªæ©èœã§ãããµãŒããŒã¢ã¯ã·ã§ã³ã䜿çšãããšãå¥ã®APIãšã³ããã€ã³ããå¿
èŠãšããã«ãReactã³ã³ããŒãã³ãããçŽæ¥åŒã³åºãããµãŒããŒãµã€ã颿°ãå®çŸ©ã§ããŸãã
ãµãŒããŒã¢ã¯ã·ã§ã³ãšå
±ã«äœ¿çšãããšãuseFormStatusã¯ã¢ã¯ã·ã§ã³ã®éä¿¡ç¶æ
ãèªåçã«è¿œè·¡ãããã©ãŒã ã€ã³ã¿ã©ã¯ã·ã§ã³ã管çããããã®ã·ã³ãã«ã§äžè²«ããæ¹æ³ãæäŸããŸãã
åŸæ¥ã®ãã©ãŒã ãã³ããªã³ã°ãšã®æ¯èŒ
useFormStatusãç»å Žããåã¯ãéçºè
ã¯ãã©ãŒã éä¿¡ãåŠçããããã«ãæåã®ç¶æ
管çãšéåææäœã«é ŒãããšããããããŸããããã®ã¢ãããŒãã«ã¯ãéåžžã以äžã®ã¹ããããå«ãŸããŠããŸããïŒ
- éä¿¡ç¶æ
ã远跡ããããã®ç¶æ
倿°ãäœæããïŒäŸïŒ
isSubmittingïŒã - ãã©ãŒã éä¿¡ãåŠçããããã®ã€ãã³ããã³ãã©ãŒãäœæããã
- ãµãŒããŒãžã®éåæãªã¯ãšã¹ããè¡ãã
- ãµãŒããŒããã®ã¬ã¹ãã³ã¹ã«åºã¥ããŠç¶æ ãæŽæ°ããã
- ãšã©ãŒãåŠçãããšã©ãŒã¡ãã»ãŒãžã衚瀺ããã
ãã®ã¢ãããŒãã¯ãç¹ã«è€æ°ã®ãã£ãŒã«ããããªããŒã·ã§ã³ã«ãŒã«ãæã€è€éãªãã©ãŒã ã®å Žåãé¢åã§ãšã©ãŒãçºçãããããªãå¯èœæ§ããããŸããuseFormStatusã¯ããã©ãŒã éä¿¡ç¶æ
ã管çããããã®å®£èšçã§äžå
çãªæ¹æ³ãæäŸããããšã§ããã®ããã»ã¹ãç°¡çŽ åããŸãã
å®äžçã®äŸãšãŠãŒã¹ã±ãŒã¹
useFormStatusã¯ã以äžãå«ãå¹
åºãå®äžçã®ã·ããªãªã«é©çšã§ããŸãïŒ
- Eã³ããŒã¹ã®ãã§ãã¯ã¢ãŠããã©ãŒã ïŒ æ¯æãæ å ±ãåŠçäžã«ããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒã衚瀺ããã
- ãŠãŒã¶ãŒç»é²ãã©ãŒã ïŒ ãŠãŒã¶ãŒå ¥åãæ€èšŒããã¢ã«ãŠã³ãäœæãåŠçããã
- ã³ã³ãã³ã管çã·ã¹ãã ïŒ èšäºãããã°æçš¿ããã®ä»ã®ã³ã³ãã³ããéä¿¡ããã
- ãœãŒã·ã£ã«ã¡ãã£ã¢ãã©ãããã©ãŒã ïŒ ã³ã¡ã³ãã®æçš¿ãæçš¿ãžã®ããããããã³ã³ãã³ãã®å ±æã
- éèã¢ããªã±ãŒã·ã§ã³ïŒ ååŒã®åŠçãã¢ã«ãŠã³ãã®ç®¡çãã¬ããŒãã®çæã
çµè«
Reactã®useFormStatusããã¯ã¯ãçŸä»£ã®Webã¢ããªã±ãŒã·ã§ã³ã«ãããŠãã©ãŒã éä¿¡ã®é²æã管çãããŠãŒã¶ãŒäœéšãåäžãããããã®è²ŽéãªããŒã«ã§ãããã©ãŒã ã®ç¶æ
管çãç°¡çŽ åãããšã©ãŒãã³ããªã³ã°ãæ¹åãã宣èšçãªã¢ãããŒããæäŸããããšã§ãuseFormStatusã¯éçºè
ãããé
åçã§ã¬ã¹ãã³ã·ããªãã©ãŒã ã€ã³ã¿ã©ã¯ã·ã§ã³ãäœæã§ããããã«ããŸãããã®æ©èœããŠãŒã¹ã±ãŒã¹ããã¹ããã©ã¯ãã£ã¹ãçè§£ããããšã§ãuseFormStatusãæŽ»çšããŠã仿¥ã®Webéçºã®èŠæ±ã«å¿ããå
ç¢ã§ãŠãŒã¶ãŒãã¬ã³ããªãŒãªãã©ãŒã ãæ§ç¯ã§ããŸãã
useFormStatusãæ¢æ±ããéã«ã¯ãã¢ã¯ã»ã·ããªãã£ãããã©ãŒãã³ã¹ã®æé©åã培åºçãªãã¹ããèæ
®ããŠããã©ãŒã ãäžçäžã®ãŠãŒã¶ãŒã«ãšã£ãŠæ©èœçãã€ãŠãŒã¶ãŒãã¬ã³ããªãŒã§ããããšã確èªããããšãå¿ããªãã§ãã ããããããã®ååãé©çšããããšã§ãã·ãŒã ã¬ã¹ã§æçããã€é
åçãªãã©ãŒã ã€ã³ã¿ã©ã¯ã·ã§ã³ãäœæããæçµçã«ã¯å
šäœçãªãŠãŒã¶ãŒäœéšã®åäžã«è²¢ç®ã§ããŸãã
ãã®èšäºã§ã¯useFormStatusã®å
æ¬çãªæŠèŠã説æããŸãããææ°ã®æ
å ±ãšAPIã®è©³çްã«ã€ããŠã¯ãå
¬åŒã®Reactããã¥ã¡ã³ããåç
§ããããšãå¿ããªãã§ãã ãããããããŒã³ãŒãã£ã³ã°ïŒ